using System;
using System.Collections.Generic;

namespace SIP.PN.Modelo.Entidades
{
    public class ProyectoTrabajo : ProyectoTareaAbstracta
    {
        private Proyecto proyecto;
        private IList<ProyectoTarea> tareas = new List<ProyectoTarea>();

        public virtual Proyecto Proyecto
        {
            get { return proyecto; }
            set { proyecto = value; }
        }

        public virtual IList<ProyectoTarea> Tareas
        {
            get { return tareas; }
            set { tareas = value; }
        }

        #region Tarea

        public virtual ProyectoTarea AgregarTarea(Tarea tarea, string xnombre, string xdescripcion, int orden, DateTime fechaSolicitud, DateTime fechaInicio, DateTime fechaFinEsperado, ProyectoTareaEstado xestado)
        {
            ProyectoTarea pt = new ProyectoTarea();
            pt.Tarea = tarea;
            pt.Nombre = xnombre;
            pt.Descripcion = xdescripcion;
            pt.Orden = orden;
            pt.FechaSolicitud = fechaSolicitud;
            pt.FechaInicio = fechaInicio;
            pt.FechaFinEsperado = fechaFinEsperado;
            pt.Estado = xestado;
            pt.PorcentajeAvance = 0;
            pt.DuracionDias = 0;
            tareas.Add(pt);
            return pt;
        }

        public virtual ProyectoTarea ObtenerTarea(int xcodigo)
        {
            foreach (ProyectoTarea tarea in tareas)
            {
                if (tarea.Codigo == xcodigo)
                    return tarea;
            }
            return null;
        }

        public virtual void EliminarTarea(int xcodigo)
        {
            ProyectoTarea pt = ObtenerTarea(xcodigo);
            if (pt != null)
            {
                tareas.Remove(pt);
            }
        }

        public virtual bool EvaluacionesCompletas()
        {
            foreach (ProyectoTarea tarea in Tareas)
            {
                if (tarea.Estado.EsFinalizada() && !tarea.EvaluacionCompleta)
                    return false;
            }
            return true;
        }

        public virtual bool TareasFinalizadas()
        {
            foreach (ProyectoTarea tarea in Tareas)
            {
                if (tarea.Estado.EsPendiente() || tarea.Estado.EsIniciada())
                    return false;
            }
            return true;
        }

        public virtual bool PuedeFinalizar()
        {
            if (!TareasFinalizadas())
                return false;

            if (!EvaluacionesCompletas())
                return false;

            return true;
        }

        #endregion
    }
}